Skip to content

运维脚本示例:应用发布(Java / Tomcat 与 PHP)

典型流程:拉代码 → 构建或同步 → 重启/覆盖站点;脚本仅供参考,注意环境与权限风险。


一、Java:Maven 构建 + Tomcat 部署 WAR

参数 $1 为 Tomcat 目录名(脚本里拼成 /usr/local/$TOMCAT_NAME)。流程:clone/pull Git、mvn package、查 PID 杀进程、备份旧 ROOT、解压 war、startup.sh

shell
#!/bin/bash
DATE=$(date +%F_%T)

TOMCAT_NAME=$1
TOMCAT_DIR=/usr/local/$TOMCAT_NAME
ROOT=$TOMCAT_DIR/webapps/ROOT

BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=tomcat-java-demo

# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
   git clone https://github.com/lizhenliang/tomcat-java-demo
   cd $PROJECT_NAME
else
   cd $PROJECT_NAME
   git pull
fi

# 构建
mvn clean package -Dmaven.test.skip=true
if [ $? -ne 0 ]; then
   echo "maven build failure!"
   exit 1
fi

# 部署
TOMCAT_PID=$(ps -ef |grep "$TOMCAT_NAME" |egrep -v "grep|$$" |awk 'NR==1{print $2}')
[ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
[ -d $ROOT ] && mv $ROOT $BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
unzip $WORK_DIR/$PROJECT_NAME/target/*.war -d $ROOT
$TOMCAT_DIR/bin/startup.sh

补充说明

  • kill -9 强制结束 JVM,可能导致事务未完成;优雅停机可用 catalina.sh stop 或 systemd。
  • ps | grep 取 PID 容易误杀同名进程,更稳妥的是读 catalina.pid(若配置)或 jps
  • unzip 到 ROOT:需确认 war 内结构;部分团队改为 webapps/app.war 由 Tomcat 自动解压。
  • Git 地址、分支应参数化;生产应用 CI/CD、制品库与 蓝绿/金丝雀 发布。

二、PHP:Git 同步到 Nginx 站点目录

参数 $1 作为 /usr/local/nginx/html/ 下子目录名;无构建步骤,rsync 同步仓库(排除 .git)。

shell
#!/bin/bash
DATE=$(date +%F_%T)

WWWROOT=/usr/local/nginx/html/$1


BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=php-demo


# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
   git clone https://github.com/lizhenliang/php-demo
   cd $PROJECT_NAME
else
   cd $PROJECT_NAME
   git pull
fi


# 部署
if [ ! -d $WWWROOT ]; then
   mkdir -p $WWWROOT
   rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
else
   rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
fi

补充说明

  • if 分支里 rsync 两段相同,可合并为一个逻辑;可增加 --delete(慎用,会删目标多余文件)。
  • DATEBACKUP_DIR 脚本中未使用,若上线需回滚可先在 rsync 前备份整个 $WWWROOT
  • PHP-FPM reload、Opcache 清理视框架而定(Laravel/Symfony 可能还需 php artisan)。
  • 旧稿中的社交群信息属于课程推广,合并时已从正文删除,仅保留技术脚本。

三、发布检查清单(建议)

  1. 构建或同步成功后再 reload/restart,尽量 health check
  2. 敏感信息(DB 密码、密钥)勿写进仓库;用环境变量或密钥管理。
  3. 关键操作 日志落盘、失败 告警,与 告警与初始化 中的邮件/Webhook 联动。